package com.janko.springbootbase.boot.stater;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;

/**
 * @Author janko
 * @Version 1.0
 * @date 2021/5/11 22:26
 * @Description 自定义starter
 */
@Configurable
//当配置文件中example.service.enabled=true时进行自动配置，如果没有设置此值就默认使用matchIfMissing对应的值
@ConditionalOnProperty(name = "enabled.autoConfiguration",matchIfMissing = true)
public class MyStater {
    /**
     * SpringBoot的核心就是 自定义注解， 按需取值
     * 1、springboot加载大量的配置类
     * 2、查看需要的功能、有没有在springboot默认写好的的自动配置类中
     * 3、查看这个自动配置类到底配置了哪些组件
     * 4、给容器中自动配置类添加组件的时候，会从properties类中获取属性
     *
     * 通过@Conditional 注解自动生效
     *
     * 背景：将这些可独立于业务代码之外的功配置模块封装成一个starter，复用的时候只需要将其在pom中引用依赖即可
     */


    /**
     * @ConditionalOnClass：当类路径classpath下有指定的类的情况下进行自动配置
     * @ConditionalOnMissingBean:当容器(Spring Context)中没有指定Bean的情况下进行自动配置
     * @ConditionalOnProperty(prefix = “example.service”, value = “enabled”, matchIfMissing = true)，当配置文件中example.service.enabled=true时进行自动配置，如果没有设置此值就默认使用matchIfMissing对应的值
     * @ConditionalOnMissingBean，当Spring Context中不存在该Bean时。
     * @ConditionalOnBean:当容器(Spring Context)中有指定的Bean的条件下
     * @ConditionalOnMissingClass:当类路径下没有指定的类的条件下
     * @ConditionalOnExpression:基于SpEL表达式作为判断条件
     * @ConditionalOnJava:基于JVM版本作为判断条件
     * @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
     * @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
     * @ConditionalOnWebApplication:当前项目是Web项目的条件下
     * @ConditionalOnResource:类路径下是否有指定的资源
     * @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个，或者在有多个Bean的情况下，用来指定首选的Bean
     */

    static {
        System.out.println("MyStarter init ");
    }

    @Bean
    public  MyStaterPerson person2(){
        return  new MyStaterPerson();
    }
}
